// Copyright (c) 2015-2016, tandasat. All rights reserved.
// Use of this source code is governed by a MIT-style license that can be
// found in the LICENSE file.

/// @file
/// Implements the ScopedLock class.

#include "ScopedLock.h"

////////////////////////////////////////////////////////////////////////////////
//
// macro utilities
//

////////////////////////////////////////////////////////////////////////////////
//
// constants and macros
//

////////////////////////////////////////////////////////////////////////////////
//
// types
//

////////////////////////////////////////////////////////////////////////////////
//
// prototypes
//

////////////////////////////////////////////////////////////////////////////////
//
// variables
//

////////////////////////////////////////////////////////////////////////////////
//
// implementations
//

_Use_decl_annotations_ ScopedLock::ScopedLock(KSPIN_LOCK* spinlock_)
    : spinlock_(spinlock_) {
  KeAcquireInStackQueuedSpinLockAtDpcLevel(spinlock_, &lock_handle_);
}

/*_Use_decl_annotations_*/ ScopedLock::~ScopedLock() {
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&lock_handle_);
}
